#ifndef INI_CONF_H
#define INI_CONF_H

#ifdef __cplusplus
extern "C" {
#endif

/*
 * 解析，生成ini格式文件
 * * 解析
 * 使用ini_conf_load()加载指定配置文件，通过ini_conf_get_*()读取指定group内key对应的value
 * * 生成
 * 使用ini_conf_new()初始化，通过ini_conf_set_*()设置指定group内key对应的value
 * 使用ini_conf_remove_*()删除指定group或key
 * * struct ini_conf生命周期
 * 分配：ini_conf_load()，ini_conf_new()
 * 释放：ini_conf_free()
 */

#define INI_CONF_COMMENT    ';'

struct ini_conf;

typedef int ini_err_t;

typedef enum {
    INI_BOOL_UNKNOWN=-1,
    INI_FALSE = 0,
    INI_TRUE = 1,
} ini_bool_t;

/*
 * 加载配置文件
 * @param file_path     文件路径
 * @param comment_chars 注释使用的字符，默认为';'
 * @param err           [输出] 错误值
 * @return              struct ini_conf *，失败为NULL
 */
struct ini_conf *ini_conf_load(const char *file_path, const char *comment_chars, ini_err_t *err);

/*
 * 创建struct ini_conf
 * @param
 * @return 失败返回NULL
 */
struct ini_conf *ini_conf_new(void);

/*
 * 释放struct ini_conf *
 * @param conf  指针
 * @return err  错误值
 */
ini_err_t ini_conf_free(struct ini_conf *conf);

/*
 * 根据错误值是否发生错误
 * @param err 错误值
 * @return 发生错误返回1， 未发生返回0
 */
int ini_conf_err(ini_err_t err);

/*
 * 错误值的字符串表示
 * @param err  错误值
 * @retrun     字符串表示
 */
char *ini_conf_strerror(ini_err_t err);

/*
 * 保存配置到配置文件
 * @param conf      配置
 * @param file_path  配置文件名
 * @return err 错误值
 */
ini_err_t ini_conf_save(struct ini_conf *conf, const char *file_path);

/*
 * 获取指定类型value
 * @param conf    配置
 * @param group   组名
 * @param key     key
 * @param err     [输出] 错误值
 * @return  int整数，double浮点数,ini_bool_t布尔值，char*字符串
 */
int ini_conf_get_integer(struct ini_conf *conf, const char *group, const char *key, ini_err_t *err);

double ini_conf_get_double(struct ini_conf *conf, const char *group, const char *key, ini_err_t *err);

ini_bool_t ini_conf_get_bool(struct ini_conf *conf, const char *group, const char *key, ini_err_t *err);

char *ini_conf_get_string(struct ini_conf *conf, const char *group, const char *key, ini_err_t *err);

/*
 * 设置指定类型value 不存在组或key时，将自动创建
 * @param conf    配置
 * @param group   组名
 * @param key     key
 * @param value   int整数，double浮点数,ini_bool_t布尔值，char*字符串
 * @param comment 注释
 * @return  err     [输出] 错误值
 */
ini_err_t ini_conf_set_integer(struct ini_conf *conf, const char *group, const char *key, int value, char *comment);

ini_err_t ini_conf_set_double(struct ini_conf *conf, const char *group, const char *key, double value, char *comment);

ini_err_t ini_conf_set_bool(struct ini_conf *conf, const char *group, const char *key, ini_bool_t value, char *comment);

ini_err_t ini_conf_set_string(struct ini_conf *conf, const char *group, const char *key, char *value, char *comment);

/*
 * 删除组
 * @param conf   配置
 * @param group  组名
 * @return  err  错误值
 */
ini_err_t ini_conf_remove_group(struct ini_conf *conf, const char *group);

/*
 * 删除组内某key
 * @param  conf   配置
 * @param  group  组名
 * @param  key    key
 * @return err    错误值
 */
ini_err_t ini_conf_remove_key(struct ini_conf *conf, const char *group, const char *key);

/*
 * 打印内部信息
 * @param  conf  配置
 */
void ini_conf_dump(struct ini_conf *conf);

#ifdef __cplusplus
}
#endif

#endif
